package ThreadingSafety;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 *  JUC -> java.util.concurrent 中的Callable接口创建任务
 *  该任务用来计算 1 + 2 + 3 + ... + 1000 .
 *
 *  Callable接口和Runnable接口类似:
 *      Runnable接口描述的任务不带返回值, Callable接口描述的任务是带有返回值的.
 *      如果当前多线程完成的任务, 希望带上结果,使用Callable接口比较好.
 */
public class TestDemo27 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 使用Callable创建一个任务.
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 0; i <= 1000; i++) {
                    sum += i;
                }
                return sum;
            }
        };

        // 一个中间类,存在的意义是让我们能拿到结果.
        FutureTask<Integer> futureTask = new FutureTask<>(callable);

        // 创建线程来执行上面的任务.
        // Thread的构造方法不能直接传 callable, 需要一个中间类:
        Thread t = new Thread(futureTask);
        t.start();

        // get方法获取线程计算结果
        // get方法会阻塞,知道上面的call方法执行完,get才会返回.
        System.out.println(futureTask.get()); //500500
    }
}
